package com.qf.factory;

import com.qf.dao.UserDao;
import com.qf.dao.UserDaoImpl;
import com.qf.service.UserService;
import com.qf.service.UserServiceImpl;

import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;

/**
 * @version 1.0
 * @auther Administrator
 * @date 2023/2/6 11:04
 * 我的自定义工厂
 *     由于同学们不想自己实现对象（new UserDaoImpl）生产对象
 *     由Spring 工厂帮助我们生产对象
 */
public class MyFactory {
    //模拟一个工厂 负责生产对象
    //资源: com.qf.dao.UserDaoImpl 包名+类名
    //反射: 自定义的工厂中写的就是反射代码

    //1： 工厂负责加载配置文件   只有配置文件中才能包名+类名
    //2： 反射：自定义的工厂中写的就是反射代码  由Spring工厂帮助我们生产对象


    //加载配置文件 .properties文件
    private Properties properties = new Properties(); //内存

    /**
     * key : userDao   value : com.qf.dao.UserDAOImpl
     * key : userService   value : com.qf.service.UserServiceImpl
     */

    //1；自动加载
    /*static {

    }*/
    //2: 人为去调用此方法才能加载
    /*public void loadProperties(){
        //配置文件的加载
    }*/
    //3： 构造器中加载配置文件

    public MyFactory(){}

    /**
     *
     * @param config  配置文件的位置  /bean.properties
     */
    public MyFactory(String config) {
        //加载配置文件
        try {
            InputStream inputStream = MyFactory.class.getResourceAsStream(config);  //相对路径  /resouces
            properties.load(inputStream);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

    /**
     * 工厂：生产对象 有包名+类名
     * @param beanName： userDao 就是同学们想要的对象的key值
     * @return
     */
    //获取对象
    public Object getBean(String beanName) {
        // 获取类路径
        //value:    com.qf.dao.UserDaoImpl
        String value = properties.getProperty(beanName);
        //反射：实例化： 创建对象在Spring的世界叫实例化  创建对象
        try {
            Class<?> aClass = Class.forName(value);
            return aClass.newInstance();//Instance:实例化
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    /**
     * 测试工厂
     * @param args
     */
    public static void main(String[] args) {
        //创建工厂的时候 已经加载了配置文件中的内容从磁盘上到内存中
        MyFactory myFactory = new MyFactory("/bean.properties");
        //工厂生产对象
        UserDao userDao = (UserDaoImpl) myFactory.getBean("userDao");
        UserService userService = (UserServiceImpl) myFactory.getBean("userService");
    }
}
